🐳 K8s作為容器的管理平台,並不直接操作容器,多層Objects各司其職,這樣設計的用意在於能提供額外的資訊,確保服務運作,而不是單純讓某個容器運行而已,資訊像是有重啟的規則(restart policy)或是執行存活性檢測(liveness)等,接下來將由內層向外介紹~
正式部署服務時,架構大致分有三層: Deployment, ReplicaSet, Pod
Pod為部署的最小單位,官方文件形容Pod像是一群鯨魚(a pod of whale) 或是豌豆(pea pod),為容器(們)的集合單位
,除了有服務的容器本身,還能結合輔助性功能的容器,從設計架構來看,能得知在流程上會是先有Pod,再產生容器於其中
Pod規範了如何執行容器,同Pod當中的容器之間共享資源、排程及上下文(context)等,上下文包含Linux namespace, cgroup等其它面向的隔離,在容器本身也會有此類的隔離設定
🏷️ 兩種pod的設計方式
Pod的檔案
# Pod的api-version
apiVersion: v1
# 指定Object類型
kind: Pod
# Pod名稱,namespace不指定則為default
metadata:
name: nginx
namespace: default
# 內裝的container規格書 (僅展示部分)
spec:
containers: # 一個container設定一組list
- name: nginx-1
image: nginx:1.14.2
ports:
- containerPort: 80
- name: nginx-2
image: nginx:1.14.2
ports:
- containerPort: 81
👉 通常不會直接建立Pod,Pod被設計為相對短暫(ephemeral)且可棄用的Object,在執行完畢、缺少資源或節點壞掉時就會移除,因此由其它Object代管Pod的生滅,在實際情況下更有擴充彈性及可用性
Pod的操作指令
# 建立pod, 指定image, port
# --dry-run=client -o yaml 不實際執行, 結果匯出為yaml
kubectl run nginx --image=nginx:1.14.2 --port=80 --dry-run=client -o yaml
# 建立pod(imeparative), 預設annotation不包含編輯紀錄, 補上紀錄 --save-config
kubectl create -f <檔案名稱>
# 建立pod(declarative)
kubectl apply -f <檔案名稱>
# 查看全部pod
# 全部namespace: -A, --all-namespaces
# 特定namespace: --namespace <名稱>
kubectl get pod
kubectl get po
kubectl get pods <optional:名稱>
# 查看特定pod詳細
kubectl describe pod <optional:名稱>
# 編輯pod: 更新既存的Pod,進入vim頁面編輯欄位/值,需注意此方式不會同步更新最初建立pod的yaml文件,並且只能更新部分屬性
# spec.containers[*].image
# spec.initContainers[*].image
# spec.activeDeadlineSeconds
# spec.tolerations
kubectl edit pod <xxx>
# 刪除pod
kubectl delete pod <xxx>
負責管理Pod數量及其生滅,原本為Replication Controller(apiVersion: v1),目前改為ReplicaSet (apiVersion: app/v1),依照selector標定要管理的Pod是誰,新版API指定selector為必要設定,管理的Pod可能非ReplicaSet所建立(領養?),功能為提供:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rc
labels: # replicaset本身的標籤
app: myapp
type: front-end
spec:
template: # 模板內容就是pod的metadata和spec部分
metadata:
name: myapp-pod
labels: # pod的標籤
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
replicas: 3
selector:
matchLabels: # 和replicaset的label做媒合
type: front-end
ReplicaSet的操作指令
# 取得ReplicaController:
kubectl get replicacontroller
# 建立replicaset
kubectl create -f <檔案名稱>
# 取得ReplicaSet
kubectl get replicaset
kubectl get rs
# 查看replicaset 說明 | 取出版本的部分
kubectl explain replicaset | grep VERSION
# 移除replicaset
kubectl delete rs <...名稱>
# 更新replicaset
# - 直接編輯
kubectl edit replicaset/new-replica-set
# - 透過檔案
kubectl replace -f replicasetreplicaset-definition.yml
# - 命令擴展
kubectl scale --replicas=x replicaset <名稱>
不熟object的時候,能直接查看說明,挺方便的
下篇待續...